home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / libs / tsipp / tsipp.lha / tsipp3.0a / sippsrc / rendering.cdiff < prev   
Encoding:
Text File  |  1992-11-02  |  13.0 KB  |  490 lines

  1. *** ../../sipp-3.0/libsipp/rendering.c    Sun May  3 08:19:12 1992
  2. --- rendering.c    Wed Oct  7 15:57:45 1992
  3. ***************
  4. *** 46,51
  5.    */
  6.   static bool          show_backfaces;  /* Don't do backface culling */
  7.   static bool          shadows;         /* Calculate shadows */
  8.   static Edge        **y_bucket;        /* Y-bucket for edge lists. */
  9.   static FILE         *image_file;      /* File to store image in      */
  10.                                         /* when rendering into a file. */
  11.  
  12. --- 46,52 -----
  13.    */
  14.   static bool          show_backfaces;  /* Don't do backface culling */
  15.   static bool          shadows;         /* Calculate shadows */
  16. + static bool          reverse_scan;    /* Render scan lines in reverse */
  17.   static Edge        **y_bucket;        /* Y-bucket for edge lists. */
  18.   static FILE         *image_file;      /* File to store image in      */
  19.                                         /* when rendering into a file. */
  20. ***************
  21. *** 226,232
  22.   
  23.               deltay = 1.0 / fabs(deltay);
  24.   
  25. !             if (nderiv > 0) {       
  26.   
  27.                   /*
  28.                    * The edge has positive slope
  29.  
  30. --- 227,234 -----
  31.   
  32.               deltay = 1.0 / fabs(deltay);
  33.   
  34. !             if ((reverse_scan    && nderiv <= 0) ||
  35. !                 ((!reverse_scan) && nderiv  > 0)) {
  36.   
  37.                   /*
  38.                    * The edge has positive slope
  39. ***************
  40. *** 999,1005
  41.       u_char       *line;
  42.       int           curr_line;
  43.       int           scanline;
  44. !     int           y, next_edge;
  45.       Color        *pixel_color;
  46.       Color         sum;
  47.       int           i, j, k;
  48.  
  49. --- 1001,1007 -----
  50.       u_char       *line;
  51.       int           curr_line;
  52.       int           scanline;
  53. !     int           y, next_edge, y_limit;
  54.       Color        *pixel_color;
  55.       Color         sum;
  56.       int           i, j, k;
  57. ***************
  58. *** 1038,1044
  59.           }
  60.       }
  61.   
  62. !     y = yres - 1;
  63.       active_list = NULL;
  64.       curr_line = 0;
  65.       scanline = 0;
  66.  
  67. --- 1040,1054 -----
  68.           }
  69.       }
  70.   
  71. !     if (reverse_scan) {
  72. !         y = 0;
  73. !         y_limit = yres;
  74. !         scanline =  (yres - 1) * oversampl;
  75. !     } else {
  76. !         y = yres - 1;
  77. !         y_limit = -1;
  78. !         scanline =  0;
  79. !     }
  80.       active_list = NULL;
  81.       curr_line = 0;
  82.   
  83. ***************
  84. *** 1041,1049
  85.       y = yres - 1;
  86.       active_list = NULL;
  87.       curr_line = 0;
  88. -     scanline = 0;
  89. -  
  90. -     while (y >= 0) {
  91.   
  92.           active_list = merge_edge_lists(active_list, y_bucket[y]);
  93.           y_bucket[y] = NULL;
  94.  
  95. --- 1051,1056 -----
  96.       }
  97.       active_list = NULL;
  98.       curr_line = 0;
  99.   
  100.       while (y != y_limit) {
  101.   
  102. ***************
  103. *** 1045,1050
  104.    
  105.       while (y >= 0) {
  106.   
  107.           active_list = merge_edge_lists(active_list, y_bucket[y]);
  108.           y_bucket[y] = NULL;
  109.           next_edge = y - 1;
  110.  
  111. --- 1052,1059 -----
  112.       active_list = NULL;
  113.       curr_line = 0;
  114.   
  115. +     while (y != y_limit) {
  116.           active_list = merge_edge_lists(active_list, y_bucket[y]);
  117.           y_bucket[y] = NULL;
  118.   
  119. ***************
  120. *** 1047,1053
  121.   
  122.           active_list = merge_edge_lists(active_list, y_bucket[y]);
  123.           y_bucket[y] = NULL;
  124. -         next_edge = y - 1;
  125.   
  126.           while (next_edge >=0 && y_bucket[next_edge] == NULL)
  127.               next_edge--;
  128.  
  129. --- 1056,1061 -----
  130.   
  131.           active_list = merge_edge_lists(active_list, y_bucket[y]);
  132.           y_bucket[y] = NULL;
  133.   
  134.           if (reverse_scan) {
  135.               next_edge = y + 1;
  136. ***************
  137. *** 1049,1058
  138.           y_bucket[y] = NULL;
  139.           next_edge = y - 1;
  140.   
  141. !         while (next_edge >=0 && y_bucket[next_edge] == NULL)
  142. !             next_edge--;
  143. !         while (y > next_edge) {
  144.               if (field == BOTH || (scanline & 1) == field) {
  145.                   buffer_clear(xres, linebuf[curr_line]);
  146.                   render_scanline(xres, linebuf[curr_line], 
  147.  
  148. --- 1057,1073 -----
  149.           active_list = merge_edge_lists(active_list, y_bucket[y]);
  150.           y_bucket[y] = NULL;
  151.   
  152. !         if (reverse_scan) {
  153. !             next_edge = y + 1;
  154. !             while (next_edge < y_limit && y_bucket[next_edge] == NULL)
  155. !                 next_edge++;
  156. !         } else {
  157. !             next_edge = y - 1;
  158. !             while (next_edge >= 0 && y_bucket[next_edge] == NULL)
  159. !                 next_edge--;
  160. !         }
  161. !         while ((reverse_scan    && (y < next_edge)) ||
  162. !                ((!reverse_scan) && (y > next_edge))) {
  163.               if (field == BOTH || (scanline & 1) == field) {
  164.                   buffer_clear(xres, linebuf[curr_line]);
  165.                   render_scanline(xres, linebuf[curr_line], 
  166. ***************
  167. *** 1096,1102
  168.                   }
  169.   
  170.                   curr_line = 0;
  171. !                 scanline++;
  172.               }
  173.               
  174.           if (active_list != NULL) {
  175.  
  176. --- 1111,1117 -----
  177.                   }
  178.   
  179.                   curr_line = 0;
  180. !                 scanline += reverse_scan ? -1 : 1;
  181.               }
  182.               
  183.           if (active_list != NULL) {
  184. ***************
  185. *** 1104,1110
  186.               edgep2 = active_list;
  187.               edgep = active_list->next;
  188.               while (edgep != NULL) {
  189. !                 if (edgep->ystart <= (edgep->ystop + 1)) {
  190.                           edgep2->next = edgep->next;
  191.                   sfree(edgep);
  192.                       edgep = edgep2->next;
  193.  
  194. --- 1119,1128 -----
  195.               edgep2 = active_list;
  196.               edgep = active_list->next;
  197.               while (edgep != NULL) {
  198. !                 if ((reverse_scan &&
  199. !                          edgep->ystart >= (edgep->ystop - 1)) ||
  200. !                         ((!reverse_scan) &&
  201. !                          edgep->ystart <= (edgep->ystop + 1))) {
  202.                           edgep2->next = edgep->next;
  203.                   sfree(edgep);
  204.                       edgep = edgep2->next;
  205. ***************
  206. *** 1114,1120
  207.               }
  208.                   }
  209.                   
  210. !               if (active_list->ystart <= (active_list->ystop + 1)) {
  211.                   edgep = active_list;
  212.               active_list = active_list->next;
  213.                   sfree(edgep);
  214.  
  215. --- 1132,1141 -----
  216.               }
  217.                   }
  218.                   
  219. !               if ((reverse_scan && 
  220. !                      active_list->ystart >= (active_list->ystop - 1)) ||
  221. !                     ((!reverse_scan) &&
  222. !                      active_list->ystart <= (active_list->ystop + 1))) {
  223.                   edgep = active_list;
  224.               active_list = active_list->next;
  225.                   sfree(edgep);
  226. ***************
  227. *** 1122,1128
  228.                   
  229.               edgep = active_list;
  230.               while (edgep != NULL) {
  231. !                 edgep->ystart--;
  232.               edgep->xstart += edgep->xstep;
  233.                       edgep->hden += edgep->hdenstep;
  234.                       if (render_mode != FLAT) {
  235.  
  236. --- 1143,1149 -----
  237.                   
  238.               edgep = active_list;
  239.               while (edgep != NULL) {
  240. !                 edgep->ystart += reverse_scan ? 1 : -1;
  241.               edgep->xstart += edgep->xstep;
  242.                       edgep->hden += edgep->hdenstep;
  243.                       if (render_mode != FLAT) {
  244. ***************
  245. *** 1138,1144
  246.               edgep = edgep->next;
  247.               }
  248.           }
  249. !             y--;
  250.       }
  251.       }
  252.       sfree(line);
  253.  
  254. --- 1159,1165 -----
  255.               edgep = edgep->next;
  256.               }
  257.           }
  258. !             y += reverse_scan ? 1 : -1;
  259.       }
  260.       }
  261.       sfree(line);
  262. ***************
  263. *** 1353,1359
  264.   {
  265.       Edge            *active_list;
  266.       Edge            *edgep, *edgep2;
  267. !     int              y, next_edge;
  268.       
  269.       y = depthmap_size - 1;
  270.       active_list = NULL;
  271.  
  272. --- 1374,1380 -----
  273.   {
  274.       Edge            *active_list;
  275.       Edge            *edgep, *edgep2;
  276. !     int              y, next_edge, y_limit;
  277.       
  278.       if (reverse_scan) {
  279.           y = 0;
  280. ***************
  281. *** 1355,1361
  282.       Edge            *edgep, *edgep2;
  283.       int              y, next_edge;
  284.       
  285. !     y = depthmap_size - 1;
  286.       active_list = NULL;
  287.    
  288.       while (y >= 0) {
  289.  
  290. --- 1376,1388 -----
  291.       Edge            *edgep, *edgep2;
  292.       int              y, next_edge, y_limit;
  293.       
  294. !     if (reverse_scan) {
  295. !         y = 0;
  296. !         y_limit = depthmap_size;
  297. !     } else {
  298. !         y = depthmap_size - 1;
  299. !         y_limit = -1;
  300. !     }
  301.       active_list = NULL;
  302.    
  303.       while (y != y_limit) {
  304. ***************
  305. *** 1358,1364
  306.       y = depthmap_size - 1;
  307.       active_list = NULL;
  308.    
  309. !     while (y >= 0) {
  310.   
  311.           active_list = merge_edge_lists(active_list, y_bucket[y]);
  312.           y_bucket[y] = NULL;
  313.  
  314. --- 1385,1391 -----
  315.       }
  316.       active_list = NULL;
  317.    
  318. !     while (y != y_limit) {
  319.   
  320.           active_list = merge_edge_lists(active_list, y_bucket[y]);
  321.           y_bucket[y] = NULL;
  322. ***************
  323. *** 1364,1371
  324.           y_bucket[y] = NULL;
  325.           next_edge = y - 1;
  326.   
  327. !         while (next_edge >=0 && y_bucket[next_edge] == NULL)
  328. !             next_edge--;
  329.   
  330.           while (y > next_edge) {
  331.   
  332.  
  333. --- 1391,1405 -----
  334.           y_bucket[y] = NULL;
  335.           next_edge = y - 1;
  336.   
  337. !         if (reverse_scan) {
  338. !             next_edge = y + 1;
  339. !             while (next_edge < y_limit && y_bucket[next_edge] == NULL)
  340. !                 next_edge++;
  341. !         } else {
  342. !             next_edge = y - 1;
  343. !             while (next_edge >= 0 && y_bucket[next_edge] == NULL)
  344. !                 next_edge--;
  345. !         }
  346.   
  347.           while ((reverse_scan    && (y < next_edge)) ||
  348.                  ((!reverse_scan) && (y > next_edge))) {
  349. ***************
  350. *** 1367,1373
  351.           while (next_edge >=0 && y_bucket[next_edge] == NULL)
  352.               next_edge--;
  353.   
  354. !         while (y > next_edge) {
  355.   
  356.               render_dmap_line(d_map + (depthmap_size - 1 - y) * depthmap_size, 
  357.                                active_list); 
  358.  
  359. --- 1401,1408 -----
  360.                   next_edge--;
  361.           }
  362.   
  363. !         while ((reverse_scan    && (y < next_edge)) ||
  364. !                ((!reverse_scan) && (y > next_edge))) {
  365.   
  366.               render_dmap_line(d_map + (depthmap_size - 1 - y) * depthmap_size, 
  367.                                active_list); 
  368. ***************
  369. *** 1377,1383
  370.               edgep2 = active_list;
  371.               edgep = active_list->next;
  372.               while (edgep != NULL) {
  373. !                 if (edgep->ystart <= (edgep->ystop + 1)) {
  374.                           edgep2->next = edgep->next;
  375.                   sfree(edgep);
  376.                       edgep = edgep2->next;
  377.  
  378. --- 1412,1421 -----
  379.               edgep2 = active_list;
  380.               edgep = active_list->next;
  381.               while (edgep != NULL) {
  382. !                 if ((reverse_scan &&
  383. !                          edgep->ystart >= (edgep->ystop - 1)) ||
  384. !                         ((!reverse_scan) &&
  385. !                          edgep->ystart <= (edgep->ystop + 1))) {
  386.                           edgep2->next = edgep->next;
  387.                   sfree(edgep);
  388.                       edgep = edgep2->next;
  389. ***************
  390. *** 1387,1393
  391.               }
  392.                   }
  393.                   
  394. !               if (active_list->ystart <= (active_list->ystop + 1)) {
  395.                   edgep = active_list;
  396.               active_list = active_list->next;
  397.                   sfree(edgep);
  398.  
  399. --- 1425,1434 -----
  400.               }
  401.                   }
  402.                   
  403. !               if ((reverse_scan && 
  404. !                      active_list->ystart >= (active_list->ystop - 1)) ||
  405. !                     ((!reverse_scan) &&
  406. !                      active_list->ystart <= (active_list->ystop + 1))) {
  407.                   edgep = active_list;
  408.               active_list = active_list->next;
  409.                   sfree(edgep);
  410. ***************
  411. *** 1395,1401
  412.                   
  413.               edgep = active_list;
  414.               while (edgep != NULL) {
  415. !                 edgep->ystart--;
  416.               edgep->xstart += edgep->xstep;
  417.                       edgep->hden += edgep->hdenstep;
  418.               edgep = edgep->next;
  419.  
  420. --- 1436,1442 -----
  421.                   
  422.               edgep = active_list;
  423.               while (edgep != NULL) {
  424. !                 edgep->ystart += reverse_scan ? 1 : -1;
  425.               edgep->xstart += edgep->xstep;
  426.                       edgep->hden += edgep->hdenstep;
  427.               edgep = edgep->next;
  428. ***************
  429. *** 1401,1407
  430.               edgep = edgep->next;
  431.               }
  432.           }
  433. !             y--;
  434.       }
  435.       }
  436.   }
  437.  
  438. --- 1442,1448 -----
  439.               edgep = edgep->next;
  440.               }
  441.           }
  442. !             y += reverse_scan ? 1 : -1;
  443.       }
  444.       }
  445.   }
  446. ***************
  447. *** 1591,1596
  448.   /*============= Functions that handles global initializations==============*/
  449.   
  450.   /*
  451.    * If called with TRUE as argument, no backface culling will 
  452.    * be performed. If a polygon is backfacing it will be rendered
  453.    * as facing in the opposit direction.
  454.  
  455. --- 1632,1648 -----
  456.   /*============= Functions that handles global initializations==============*/
  457.   
  458.   /*
  459. +  * If the argument is TRUE, render the scanlines in reverse.
  460. +  */
  461. + void
  462. + sipp_render_direction (flag)
  463. +     bool flag;
  464. + {
  465. +     reverse_scan = flag;
  466. + /*    reverse_scan = FALSE; /**/
  467. + }
  468. + /*
  469.    * If called with TRUE as argument, no backface culling will 
  470.    * be performed. If a polygon is backfacing it will be rendered
  471.    * as facing in the opposit direction.
  472. ***************
  473. *** 1648,1652
  474.       camera_init();
  475.       sipp_show_backfaces(FALSE);
  476.       sipp_shadows(FALSE, 0);
  477.       sipp_background(0.0, 0.0, 0.0);
  478.   }
  479.  
  480. --- 1700,1705 -----
  481.       camera_init();
  482.       sipp_show_backfaces(FALSE);
  483.       sipp_shadows(FALSE, 0);
  484. +     sipp_render_direction(FALSE);
  485.       sipp_background(0.0, 0.0, 0.0);
  486.   }
  487.